#include "tcp.server.hh"

void usage(char *proc)
{
    std::cout << "\nUsage: " << proc << " ip  port\n";
}
// 127.0.0.1 本地環迴

// ./udp_client 127.0.0.1 8080
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        usage(argv[0]);
        exit(1);
    }
    // 還是先創建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0); // AF_INET==PF_INET
    if (sock < 0)
    {
        std::cerr << errno << ":" << strerror(errno) << endl;
        exit(2);
    }
    // 客戶的要不要綁定？服务器是一定要绑定端口号的，一经绑定时不再更改的，客户端也是需要绑定的但是不需要显式的绑定，让os自动去进行port选择
    // 最重要的是连接别人的能力

    struct sockaddr_in server;
    memset(&server, 0, sizeof(server)); // bzero()是一樣的
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(argv[1]); // 這一點要重點注意一下
    server.sin_port = htons(atoi(argv[2]));

    if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        std::cerr << errno << ":" << strerror(errno) << endl;
        exit(3);
    }
    cout << "connect success!" << endl;
    while (1)
    {
        string message;
        cout << "請輸入你想發送的信息：";
        getline(cin, message);
        if (message == "quit")
            break;
        // 儅client第一次給服務器發送消息時，OS會自動給client bind他的IP和Port
        // sendto(sock, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server));//udp专用
        send(sock, message.c_str(), message.size(), 0); // tcp专用
        char buffer[1024];
        //ssize_t s = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&tmp, &len);//ssize_t==long int
        ssize_t s=recv(sock,buffer,sizeof(buffer)-1,0);//tcp 专用
        if (s > 0)
        {
            buffer[s] = 0;
            cout << "server 回显: " << buffer << endl;
        }
        else if(s==0)
        {
            break;
        }
        else
        {
            break;
        }
    }
    close(sock);
    return 0;
}
